'''
模拟马尔科夫过程中元器件失效的事件。
一个并联系统，两个单元的可靠度都是90%.有四种状态：
完好、1故障、2故障、完全故障。这四种分别对应以下四个单词：
intact\1fail\2fail\breakdown

作者：侯展意
协议：木兰2.0
'''
import numpy as np
import takagiabm as tak


def modelSetup(model):
    global density
    for x in range(model.width):
        for y in range(model.height):

            a = np.array((x, y))

            model.grid.getCellByPos(a).setProperty('status', 'intact')
            model.grid.getCellByPos(a).setProperty('color', tak.green)  # 设置绿色


def cellStep(cell:tak.Cell):
    global reliability1,reliability2
    status=cell.getTrait('status')
    if(status=='intact'):
        if(tak.randBool(1 - reliability1.value)):# 如果有1-0.9的可能性发生故障。
            cell.setTrait('status','1fail')
            cell.setColor(tak.yellow)
        elif(tak.randBool(1 - reliability2.value)):
            cell.setTrait('status','2fail')
            cell.setColor(tak.orange)
    elif(status=='1fail'):
        if(tak.randBool(1 - reliability2.value)):
            cell.setTrait('status','breakdown')
            cell.setColor(tak.red)
    elif(status=='2fail'):
        if(tak.randBool(1 - reliability1.value)):
            cell.setTrait('status','breakdown')
            cell.setColor(tak.red)

reliability1= tak.Var('1器件可靠度', 0.94, range=(0.9, 0.01, 1))  # min,max,step，最小，最大和步长。
reliability2 = tak.Var('2器件可靠度', 0.97, range=(0.9, 0.01, 1))  # min,max,step，最小，最大和步长。

varList = [reliability1,reliability2]

counterList=[tak.DataCounter(name='颜色', propertyName='status', targets=['cell'],chartType='bar'),
                            tak.DataCounter(name='颜色', propertyName='color', targets=['cell'],chartType='line')]

tak.GridModel=tak.prepareModel(tak.GridModel,varList=varList,agentActivationPolicy='none',
                               cellActivationPolicy='casual',modelInitFunc=modelSetup,dataCounterList=counterList)

tak.Cell=tak.prepareCell(tak.Cell,cellStep)


if __name__ == "__main__":
    tak.GridModel.width = 50
    tak.GridModel.height = 50
    tak.simStart(__file__, tak.GridModel, noGUI=False, maxSteps=10)





